package cn.wyl.controller;

import cn.wyl.domain.User;
import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;


/**
 *
 * 该接口通过RestTemplate调用用户服务，给客户端返回一个客户
 */
@RestController
@DefaultProperties(defaultFallback ="fallbackMethod")	//统一降级配置
public class OrderController {
    //需要配置成Bean
    @Autowired
    private RestTemplate restTemplate;


    //浏览器调用该方法
    @RequestMapping("/order/{id}")
   // @HystrixCommand(fallbackMethod = "fallbackMethod")   //方法熔断
    @HystrixCommand   //方法熔断
    public User getById(@PathVariable("id")Long id){
        //通过RestTemplate发送http请求调用 user的服务的路径
        //String url="http://localhost:1020/user/"+id;

        //把 “localhost:1020” 修改为 用户服务的服务名 。底层会通过服务发现的方式使用Ribbin进行负载均衡调用。
        String url = "http://user-server/user/"+id;

        //通过RestTemplate发送http请求
        return  restTemplate.getForObject(url, User.class);
    }

    //降级方法 ， 参数和返回值必须和被熔断的方法一致 ，方法名要和  fallbackMethod 的值一致
   /* public User fallbackMethod(@PathVariable("id")Long id){
        //返回托底数据
        return new User(-1L ,"无此用户","用户服务不可用");
    }*/

    //托底方法 公共的托底方法不应该有参数。返回类型必须和熔断的方法的返回类型兼容，比如这里可以返回User或者User的子类
    public User fallbackMethod(){
        //返回友好的提示信息
        return new User(-1L,"无此用户","公共托底方法：用户服务不可用");
    }
}
